# @Time    : 2022/8/22 10:17
# @Author  : 南黎
# @FileName: 7.键盘键位操作.py
import win32gui
import win32api
import win32con
# 注意窗口句柄获取如果失败，要做好异常处理
try:
    # 获取窗口句柄
    handle = win32gui.FindWindowEx(0, 0, "Notepad", None)#桌面窗口的所有子窗口检索类名"Edit"，标题为None的窗口
    print("窗口句柄是：{}".format(handle))

    # 设置窗口
    # 参数：句柄，窗口左边界，窗口上边界，窗口宽度，窗口高度，确定窗口是否被刷新
    win32gui.MoveWindow(handle, 0, 0, 500, 500, True)
    # 设置窗口后获取窗口信息，查看是否设置成功
    handleMessage = win32gui.GetWindowRect(handle)#通过窗口句柄获取窗口信息
    print("修改窗口后的窗口 x,y坐标，还有宽度，高度是：{}".format(handleMessage))

    # 将创建指定窗口的线程设置到前台，并且激活该窗口
    win32gui.SetForegroundWindow(handle)
    #加入延时，否则可能会操作失败
    print("如果没有下面以这一行代码，可能无法正常输入A B 字母，这就是延时等待的作用")
    win32api.Sleep(1000)

    #激活窗口输入栏
    #模拟鼠标在(246,217)位置进行点击操作，这个坐标主要是点击一下txt记事本的输入窗口，激活焦点
    point = (246,217)
    win32api.SetCursorPos(point)
    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, 0, 0)#按下鼠标左键
    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP, 0, 0)#松开鼠标左键

    #加入延时，否则可能会操作失败
    win32api.Sleep(1000)

    #在记事本中输入A B 字母
    win32api.keybd_event(65, 0, 0, 0)#按下A
    win32api.keybd_event(66, 0, 0, 0)#按下B
    win32api.keybd_event(65, 0, win32con.KEYEVENTF_KEYUP, 0)#松开A
    win32api.keybd_event(66, 0, win32con.KEYEVENTF_KEYUP, 0)#松开B

except Exception as e:
    print("窗口句柄获取失败或是前台设置失败：{}".format(e))

# 通过 keybd_event(bVk, bScan, dwFlags, dwExtraInfo) 可以进行监听键盘事件
#
# bVk：虚拟键码
#
# bScan：硬件扫描码，一般设置为0即可
#
# dwFlags：函数操作的一个标志位，如果值为KEYEVENTF_EXTENDEDKEY则该键被按下，也可设置为0即可，如果值为KEYEVENTF_KEYUP(也就是1）则该按键被释放
#
# dwExtraInfo：定义与击键相关的附加的32位值，一般设置为0即可